#pragma once
#include <string>
#include <iostream>
#include "InetAddr.hpp"
#include <vector> //管理用户的
#include "Log.hpp"
#include"Mutex.hpp"
using namespace LogModule;
using namespace MutexModule;
class Route
{
private:
    bool IsExist(InetAddr &peer)
    {
        for (auto &user : _online_user) // 遍历所有的在线用户
        {
            if (user == peer) // 如果用户已经存在，那么就不用再添加了
            {
                return true;
            }
        }
        return false;
    }
    void AddUser(InetAddr &peer)
    {
        LOG(LogLevel::INFO) << "新增一个在线用户" << peer.StringAddr();
        _online_user.push_back(peer); // 将用户添加进来
    }
    void DeleteUser(InetAddr &peer)
    {
        // 遍历整张用户表，直到找到了这个用户，我们就进行删除擦偶走
        for (auto iter = _online_user.begin(); iter != _online_user.end(); iter++)
        {
            if (*iter == peer)
            {
                _online_user.erase(iter); // 删除用户
                break;
            }
        }
    }

public:
    Route()
    {
    }
    void MessageRoute(int sockfd, const std::string &message, InetAddr &peer) // 将这个客户发送的message转发给所有的人
    {
        LockGuard lock(_mutex); // 加锁
        // 判断用户是否存在
        if (!IsExist(peer)) // 用户不存在的情况下
        {
            AddUser(peer); // 将用户添加进来
        }
        // 走到这里，说明这个用户一定在线了

        std::string send_message = peer.StringAddr() + '#' + message; // 给这个用户加上标识符,127.0.0.1:8888#hello
        // 将一条消息转发给所有在线用户
        for (auto &user : _online_user) // 遍历所有的在线用户
        {
            sendto(sockfd, message.c_str(), message.size(), 0, (const struct sockaddr *)&(user.NetAddr()), sizeof(user.NetAddr())); // 将消息发送给这个对应网络地址的用户
        }

        if (message == "QUIT")
        {
            // 用户退出，我们要将他从在线用户列表中删除
            DeleteUser(peer);
        }
    }
    ~Route()
    {
    }

private:
    // 首次给我们发消息等同于登录，我们要将在线用户都记录下来
    std::vector<InetAddr> _online_user; // 在线用户，对每个InetAddr对象都记录下来，包括IP和端口号
    Mutex _mutex; // 互斥锁
};